import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;


public class BuilderLaberintoXML extends BuilderLaberinto {

	public void buildMatrizLaberinto(){
		ConsultorXML consultor=new ConsultorXML(Config.PATH_LABERINTO);
		List<String> informacionParseada= consultor.consultarInformacionLaberinto();
		ListIterator<String> it= informacionParseada.listIterator();
		this.alto=Integer.parseInt(it.next());
		this.ancho=Integer.parseInt(it.next());
		int nodoAncho=Integer.parseInt(it.next());
		int nodoAlto=Integer.parseInt(it.next());
		
		it= informacionParseada.listIterator(it.nextIndex()+2);
	
		Posicion[][] matrizLaberinto=new Posicion[alto][ancho];
		
		while( it.hasNext() ){
			String id= it.next();
			int fila= Integer.parseInt(it.next());
			int columna= Integer.parseInt(it.next());
			
			String comida= it.next();
			ComidaPacman comidaPacman;

			matrizLaberinto[fila][columna]= new Posicion(id,fila,columna);

			if (comida.equals("")) comidaPacman=new Ninguna();
			else if (comida.equals("bolita")) comidaPacman=new Bolita();
			else comidaPacman=new Bolon();
			
			matrizLaberinto[fila][columna].setearComida(comidaPacman);
			
			it= informacionParseada.listIterator((it.nextIndex()+4));
			
		}
		
		it= informacionParseada.listIterator();
		it= informacionParseada.listIterator(it.nextIndex()+6);
		while (it.hasNext()){
			it= informacionParseada.listIterator(it.nextIndex()+1);
			int posx= Integer.parseInt(it.next());
			int posy= Integer.parseInt(it.next());
			it= informacionParseada.listIterator(it.nextIndex()+1);
			
			
			String idAdyacente = it.next();
			
			if (!idAdyacente.equals("")){
				int[] v = calcular_coord(idAdyacente);
				matrizLaberinto[posx][posy].agregarAdjacente( Direccion.Izquierda, matrizLaberinto[v[0]][v[1]]);
			}
			
			idAdyacente = it.next();
		
			if (!idAdyacente.equals("")){
				int[] v = calcular_coord(idAdyacente);
				matrizLaberinto[posx][posy].agregarAdjacente( Direccion.Derecha, matrizLaberinto[v[0]][v[1]]);
			}
		
			idAdyacente = it.next();
			
			if (!idAdyacente.equals("")){
				int[] v = calcular_coord(idAdyacente);
				matrizLaberinto[posx][posy].agregarAdjacente( Direccion.Arriba, matrizLaberinto[v[0]][v[1]]);
			}
			
			idAdyacente = it.next();
			
			if (!idAdyacente.equals("")){
				int[] v = calcular_coord(idAdyacente);
				matrizLaberinto[posx][posy].agregarAdjacente( Direccion.Abajo, matrizLaberinto[v[0]][v[1]]);
			}

		}
		this.matlaberinto= matrizLaberinto;
	}
	
	
	
	private int[] calcular_coord(String direccion){
		int x=0;
		if (!direccion.equals("")){
			x= Integer.parseInt(direccion);
			
		}
		int[] v={(x/100), (x%100)};
		return v;
	}
	

	/*obtiene y regresa valores de pacman y fantasmas*/
	
	public void buildPosicionesPersonajes() {
		
		ConsultorXML consultor=new ConsultorXML(Config.PATH_LABERINTO);
		List<String> informacionParseada= consultor.consultarInformacionLaberinto();
		ListIterator<String> it= informacionParseada.listIterator();
		
		it= informacionParseada.listIterator(it.nextIndex()+4);
		int[] inicioPacman= this.calcular_coord(it.next());
		int[] inicioFantasmas= this.calcular_coord(it.next());
		
		this.posPacman= this.matlaberinto[inicioPacman[0]][inicioPacman[1]];
		this.posFantasma= this.matlaberinto[inicioFantasmas[0]][inicioFantasmas[1]];
		
	}
	
	
	public void buildPersonajes(){
		ConsultorXML consultor=new ConsultorXML(Config.PATH_PERSONAJES);
		
		List<String> informacionParseadaPersonajes= consultor.consultarInformacionPersonajes();
		ListIterator<String> it= informacionParseadaPersonajes.listIterator();
		
		String idPosicion= it.next();
		int posx_actual_p = Integer.parseInt(it.next());
		int posy_actual_p = Integer.parseInt(it.next());
		
		this.pacman=new Pacman(this.matlaberinto[posx_actual_p][posy_actual_p]);
		this.pacman.setPosicionInicial(this.posPacman);
		//String dirPacman= it.next();
		this.pacman.setearDireccion(this.obtenerDireccionDeString(it.next()));
		
		it= informacionParseadaPersonajes.listIterator(it.nextIndex()+1);
		boolean finDeJuego=it.next().equals("true"); // no sirve para nada, despues lo saco.
		
		this.fantasmas=new ArrayList<Fantasma>();
		
		while (it.hasNext()){
			it= informacionParseadaPersonajes.listIterator(it.nextIndex()+2);
			int posx_actual_f = Integer.parseInt(it.next());
			int posy_actual_f = Integer.parseInt(it.next());
			
			String dirFantasma= it.next();
			String tipoF= it.next();
			String estadoF= it.next();
			
			State estado= this.determinarEstadoFantasm(estadoF);
			Fantasma fantasma= this.determinarFantasma(tipoF, estado, this.matlaberinto[posx_actual_f][posy_actual_f]);
			
			fantasma.setPosicionInicial(this.posFantasma);
			fantasma.setDireccionActual(this.obtenerDireccionDeString(dirFantasma));
			
			//agregue esta linea (pablo)
			fantasma.setDirInicial(Direccion.Abajo);
			
			this.fantasmas.add(fantasma);
			
		}
		
	}
	
	public Direccion obtenerDireccionDeString(String s){
		if (s.equals("izquierda")) return Direccion.Izquierda;
		else if (s.equals("derecha")) return Direccion.Derecha;
		else if (s.equals("arriba")) return Direccion.Arriba;
		else return Direccion.Abajo;
		
	}	
	
	private State determinarEstadoFantasm(String estadoF) {
		if (estadoF.equals("cazador")) return new CazandoTranquilo();
		else if (estadoF.equals("presa")) return new Escapando();
		else return new Muerto();
	}
	
	private Fantasma determinarFantasma(String tipo, State estado, Posicion p){
		if (tipo.equals("perezoso")) return new Perezozo(Config.TIEMPO_PRESA,Config.TIEMPO_MUERTO,estado,p);
		else if (tipo.equals("buscador")) return new Buscador(Config.TIEMPO_PRESA,Config.TIEMPO_MUERTO,estado,p);
		else if (tipo.equals("temperamental")) return new Temperamental(Config.TIEMPO_PRESA,Config.TIEMPO_MUERTO,estado,p);
		else return new Zonzo(Config.TIEMPO_PRESA,Config.TIEMPO_MUERTO,estado,p);
	}



	public int getAlto(){return this.alto;}
	public int getAncho(){return this.ancho;}

	
	public Posicion[] getPosicionesPersonajes(){
		Posicion[] p= {this.posPacman, this.posFantasma};
		return p;
	}
	
}
